           #  验证app,专门用于验证,独立于users

import logging   # 导入日志模块 python自带

from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from django.views import View
from django_redis import get_redis_connection   # redis模块

from utils.captcha.captcha import captcha   # 生成图片验证码的实例,
from . import constants   # 验证码图片过期时间
from users.models import Users

# 日志器实例
logger =logging.getLogger('django')
# 1.创建视图    图片验证码实现
class ImageCode(View):
    """
    define image verification view    定义图片验证视图
    /image_code/<uuid:image_code_id>   接口的url路径定义
    """
    # 2.从前端获取参数UUID并校验
    def get(self,request,image_code_id):
        # 3.生成验证码文本和验证码图片
         text,image =captcha.generate_captcha()
        # 4.建立redis,并且将图片验证码保存到redis
         con_redis = get_redis_connection(alias="verify_codes") # alias不指定就会保存到setting的默认路径中
         img_key ="img_{}".format(image_code_id) # 拼接图片
                   # img_123e4567-e89b-12d3-a456-426655440000
         con_redis.setex(img_key,constants.IMAGE_CODE_REDIS_EXPIRES,text) # 设置图片信息并保存到redis中
                    #     图片     图片验证吗的过期时间(可以直接写秒数:60, 全局常量)            图片验证吗的文本
         logger.info("Image code {}".format(text))    # 后台显示日志信息--验证码文本
        # 5. 把验证码图片返回给前端
         return HttpResponse(content=image,content_type='image/jpg')   # 返回图片到注册表相应位置


# 1.创建视图    判断用户是否注册

class CheckUsernameView(View):
    """
    check whether the user exists   判断用户是否存在
    """
    # 2.校验参数
    def get(self,request,username):
        # # 3.查询数据:
        # user = Users.objects.filter(username=username)
        # # 4.返回校验的结果
        # if not user:                                         # 此方法前端不能看到,不适用
        #     return HttpResponse('可以注册')
        # else:
        #     return HttpResponse('不能注册')

        count = Users.objects.filter(username=username).count()  # 数据统计
        data ={
            'username':username,
            #'count': True if count else False   # 存在就是True,否则为0
            'count':count,  # 1 或者0
        }
        return JsonResponse(data=data)  # 返回json数据给前端判断